#include <iostream>
#include <cstring>
#include <algorithm>
// 定义树节点结构体，并添加构造函数初始化指针
struct treenode {
    char data;
    treenode* left;
    treenode* right;
    treenode(char val) : data(val), left(nullptr), right(nullptr) {}
};
// 在中序遍历中查找根节点的位置
int findroot(char *mid, int n, char data) {
    for(int i = 0; i < n; i++) {
        if(data == mid[i]) return i;
    }
    return -1; // 若未找到，返回 -1
}
// 递归函数重建二叉树
treenode* createtree(char *mid, char *sur, int n, bool &valid) {
    if(n <= 0) return nullptr;
    treenode *root = new treenode(sur[n - 1]);
    int k = findroot(mid, n, root->data);
    if(k == -1) {
        // 如果找不到根节点，标记为无效
        valid = false;
        delete root;
        return nullptr;
    }
    // 递归构建左子树
    root->left = createtree(mid, sur, k, valid);
    // 递归构建右子树
    root->right = createtree(mid + k + 1, sur + k, n - 1 - k, valid);
    return root;
}
// 先序遍历函数
void preordert(treenode *root, std::string &pre) {
    if(root == nullptr) return;
    pre += root->data;
    preordert(root->left, pre);
    preordert(root->right, pre);
}
// 计算二叉树高度
int getHeight(treenode* root) {
    if(root == nullptr) return 0;
    int leftHeight = getHeight(root->left);
    int rightHeight = getHeight(root->right);
    return std::max(leftHeight, rightHeight) + 1;
}
// 释放内存
void deleteTree(treenode* root) {
    if (root == nullptr) return;
    deleteTree(root->left);
    deleteTree(root->right);
    delete root;
}
int main() {
    char postorder[30], inorder[30]; 
    while(std::cin >> postorder >> inorder) {
        int postLen = strlen(postorder);
        int inLen = strlen(inorder);
        // 检查长度是否相同
        if(postLen != inLen) {
            std::cout << "INVALID" << std::endl;
            continue;
        }
        // 检查是否由相同的字符组成
        char sortedPost[27], sortedIn[27];
        // 重建二叉树
        bool valid = true;
        treenode* root = createtree(inorder, postorder, inLen, valid);
        if(!valid) {
            std::cout << "INVALID" << std::endl;
            deleteTree(root);
            continue;
        }
        // 计算高度
        int height = getHeight(root);
        // 获取先序遍历
        std::string preorder = "";
        preordert(root, preorder);
        // 输出结果
        std::cout << height-1 << std::endl;
        std::cout << preorder << std::endl;
        // 释放内存
        deleteTree(root);
    }
    return 0;
}
//树的右边第一个，根后序。
//从中序找。
//分离中序，后序，记得返回根。
